// ISecurityUnitManager.aidl
package com.sgcc.pda.hw;
import com.sgcc.pda.hw.ReturnResult;
// Declare any non-default types here with import statements

interface ISecurityUnitManager2 {

    /**
     * 获取安全单元信息
     *
     * @return ReturnResult  :int code  0 成功  其他失败
     *                        :List<String> datas（code==0）:   size==
     *                        0:status                        安全单元状态字
     *                        1:appVersion                    软件版本号
     *                        2:version                       硬件版本号
     *                        3:cEsamNum                      C-ESAM序列号
     *                        4:operator                      操作者代码
     *                        5:operatorPower                 权限
     *                        6:cover                         权限掩码
     *                        7:operatorInfo                  操作者信息
     *                        8:yEsamNum                      Y-ESAM序列号
     *                        9:yEsamVersion                  Y-ESAM对称密钥密钥版本
     *                        10:mainStationCertificateVersion 主站证书版本号
     *                        11:terminalCertificateVersion    终端证书版本号
     *                        12:mainStationCertificateNum     主站证书序列号
     *                        13:terminalCertificateNum        终端证书序列号
     *                        14:counter                       当前计数器
     *                        15:encryptNum                    转加密剩余次数
     *                        16:labelSecretVersion            标签密钥版本
     *                        17:mainStationCertificate        主站证书
     *                        18:terminalCertificate           终端证书
     *                         :List<String> datas(code==其他): size==0
     * @return 0-成功 其他-错误码
     */
    ReturnResult getSafeUnitMessage();

    /**
     * 检测登录密码
     * password  传入的密码
     * @return ReturnResult  :int code  0 成功  其他失败
     *                       :List<String> datas（code==0）:
     *                                              0：remainCount 返回剩余验证次数
     *                       :List<String> datas(code==其他): size==0
     *
     */
    ReturnResult checkUserPassword(String password);

    /**
     * 修改操作员密码
     *
     * @param oldPassword 原密码
     * @param newPassword 新密码
     * @return ReturnResult  :int code  0 成功  其他失败
     *                       :List<String> datas（code==0）:   size==0
     *                       :List<String> datas(code==其他): size==0
     */
    ReturnResult changePassword(String oldPassword, String newPassword);

     /**
      * 应用层身份认证
      * @param m1 密文m1
      * @param s1 m1签名
      * @return ReturnResult  :int code  0 成功  其他失败
      *                        :List<String> datas（code==0）:   size==19
      *                        0:m2     密文m2
      *                        1:s2     m2签名
      *                         :List<String> datas(code==其他): size==0
      * @return 0-成功 其他-错误码
      */
     ReturnResult loginIdauth(String m1, String s1);

     /**
      * 从安全单元获取随机数
      * @param esamType     ESAM类型  01，操作员ESAM；02业务ESAM
      * @param randomLength 随机数长度  4，8，16
      * @return ReturnResult  :int code  0 成功  其他失败
      *                        :List<String> datas（code==0）:   size==1
      *                        0:random       随机数
      *                         :List<String> datas(code==其他): size==0
      * @return 0-成功 其他-错误码
      */
     ReturnResult getRandomNum(String esamType, String randomLength);

     /**
      * 锁定安全单元
      * @param data 认证数据
      * @return ReturnResult  :int code  0 成功  其他失败
      *                        :List<String> datas（code==0）:   size==0
      *                         :List<String> datas(code==其他): size==0
      * @return 0-成功 其他-错误码
      */
     ReturnResult lockingSafeUnit(String data);

     /**
      * 二次发行安全单元
      * @param esamType esam类型  01，C-ESAM；02Y-ESAM；
      * @param fxData   发行数据  2+N
      * @return ReturnResult  :int code  0 成功  其他失败
      *                        :List<String> datas（code==0）:   size==0
      *                        0:esamData       ESAM返回数据内容
      *                         :List<String> datas(code==其他): size==0
      * @return 0-成功 其他-错误码
      */
     ReturnResult safyUnitTwoSend(String esamType, String fxData);

     /**
      * 透明转发ESAM指令
      *
      * @param esamType esam类型 01，C-ESAM；02Y-ESAM；
      * @param data     转发数据内容 转发数据长度+转发数据内容
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:rtnEsamType    esam类型 01，C-ESAM；02Y-ESAM；
      * 0:rtnData       转发返回数据内容
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult transmitEsamOrder(String esamType, String data);

     /**
      * 转加密初始化
      *
      * @param esamType esam类型 01，C-ESAM；02Y-ESAM；
      * @param data     转发数据内容 转发数据长度+转发数据内容
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:result 执行结果数据
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult encryptInitialize( String data);

     /**
      * 置离线计数器
      *
      * @param data     数据
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==0
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult resetOflineCounter( String data);

     /**
      * 本地密钥计算MAC
      *
      * @param randomM 随机数M
      * @param data    2+N 数据长度+数据
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:mac     Mac
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult localKeyComputeMac( String randomM, String data);

     /**
      * 本地密钥验证MAC
      *
      * @param randomM 主站身份认证时返回的随机数M
      * @param data    待计算数据
      * @param mac     已有传输MAC
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:result  验证结果
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult localKeyCheckMac( String randomM, String data, String mac);

     /**
      * 会话密钥计算MAC
      *
      * @param data 2+N 数据长度+数据
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:mac  Mac
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult sessionKeyComputeMac( String data);

     /**
      * 会话密钥核对MAC
      *
      * @param data   待计算数据
      * @param mac    已有传输MAC
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:result 验证结果
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult sessionKeyCheckMac( String data, String mac);

     /**
      * 电能表红外认证（09、13）
      *
      * @param meterNo            表号  高位在前（非颠倒），高2字节补0x0
      * @param esamNo             ESAM序列号
      * @param mRandom1           随机数1密文
      * @param infraredAuthority1 红外认证权限1
      * @param infraredAuthority2 红外认证权限2
      * @param random2            随机数2
      * @param curTime            掌机当前时间  YYMMDDhhmmss
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:mRandom2           随机数2密文
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterInfraredAuthentication( String meterNo, String esamNo, String mRandom1, String infraredAuthority1,
                                                         String infraredAuthority2, String random2, String curTime);

     /**
      * 电能表红外认证（09、13）
      *
      * @param meterNo            表号  高位在前（非颠倒），高2字节补0x0
      * @param esamNo             ESAM序列号
      * @param mRandom1           随机数1密文
      * @param infraredAuthority1 红外认证权限1
      * @param infraredAuthority2 红外认证权限2
      * @param random2            随机数2
      * @param curTime            掌机当前时间  YYMMDDhhmmss
      * @param type               公私钥标志 0为公钥，1为私钥
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:mRandom2           随机数2密文
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterInfraredAuthentication1( String meterNo, String esamNo, String mRandom1, String infraredAuthority1,
                                                          String infraredAuthority2, String random2, String curTime, String type);

     /**
      * 远程身份认证（09、13）
      *
      * @param meterNo                 表号 高位在前（非颠倒），高2字节补0x00；
      * @param authenticationAuthority 身份认证权限
      * @param curTime                 掌机当前时间  YYMMDDhhmmss
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:cipher                  身份认证密文
      * 1:random1                 随机数1
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult remoteAuthentication( String meterNo, String authenticationAuthority, String curTime, String keyType);

     /**
      * 电能表控制（09、13）
      *
      * @param meterNo                表号  高位在前（非颠倒），高2字节补0x00
      * @param random                 随机数  身份认证产生的随机数
      * @param remoteControlAuthority 远程控制权限
      * @param orderCode              命令码
      * @param endTime                截止时间（yyMMddhhmmss 6字节）+4字节MAC
      * @param mac1                   4字节MAC
      * @param curTime                掌机当前时间
      * @param isAgMeter              是否为农排表控制
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:cipher                 控制数据密文
      * 1:mac                    MAC
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterControl( String meterNo, String random, String remoteControlAuthority, String orderCode, String endTime, String mac1, String curTime, boolean isAgMeter);

     /**
      * 透明转发ESAM指令
      *
      * @param meterNo        表号  高位在前（非颠倒），高2字节补0x00
      * @param random         随机数  身份认证产生的随机数
      * @param paramAuthority 参数设置权限
      * @param paramType      参数类型 03，二类参数； 05，一类参数； 06，一套费率；  07，备用套费率；
      * @param dataSign       数据标识
      * @param paramValue     参数值
      * @param mac1           MAC  参数类型为05、06、07时，MAC值是参数值的MAC， 参数类型为03时，MAC值是数据标示及参数值的MAC
      * @param curTime        掌机当前时间  YYMMDDhhmmss
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:length         长度		包含MAC的长度
      * 1:param          参数明文或密文
      * 2:mac            MAC
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterParamSet( String meterNo, String random, String paramAuthority, String paramType, String dataSign, String paramValue, String mac1, String curTime);

     /**
      * 电能表校时（09、13）
      *
      * @param meterNo        表号  高位在前（非颠倒），高2字节补0x00
      * @param random         随机数  身份认证产生的随机数
      * @param checkAuthority 校时权限
      * @param dataSign       数据标识
      * @param paramValue     参数值
      * @param mac1           MAC值是数据标示及参数值的MAC
      * @param week           星期
      * @param curTime        掌机当前时间  YYMMDDhhmmss
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==3
      * 0:length         长度		包含MAC的长度
      * 1:cipher         校时数据密文
      * 2:mac            MAC
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterCheckTime( String meterNo, String random, String checkAuthority, String dataSign, String paramValue, String mac1, String week, String curTime);

     /**
      * 电能表密钥更新(09)
      *
      * @param meterNo      表号  高位在前（非颠倒），高2字节补0x00
      * @param random       随机数  身份认证产生的随机数
      * @param athorityData 权限数据
      * @param secret       密钥密文
      * @param curTime      掌机当前时间  YYMMDDhhmmss
      * @param keySign      密钥状态标志位  00：密钥恢复  01：密钥下装
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:length       数据长度
      * 1:cipher       密钥数据  密钥信息（4）+MAC（4）+密钥密文（32）
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult secretUpdate09( String meterNo, String random, String athorityData, String secret, String curTime, String keySign);

     /**
      * 电能表密钥更新(13)
      *
      * @param meterNo      表号  高位在前（非颠倒），高2字节补0x00
      * @param random       随机数  身份认证产生的随机数
      * @param athorityData 权限数据
      * @param cipher       密钥密文
      * @param curTime      掌机当前时间  YYMMDDhhmmss
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:secret       密钥数据块   2+N  数据长度+密钥1…密钥N
      * 1:mac          MAC
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult secretUpdate13( String meterNo, String random, String athorityData, String cipher, String curTime);

    /**
      * 电能表开户充值（09、13）
      *
      * @param meterNo       表号  高位在前（非颠倒），高2字节补0x00
      * @param random        随机数  身份认证产生的随机数
      * @param athorityData1 权限数据1
      * @param athorityData2 权限数据2
      * @param rechargeData  开户数据 数据标识（4字节）+购电金额（4字节）+购电次数（4字节）+MAC1（4字节）+客户编号（6字节）+MAC2（4字节）
      * @param curTime       掌机当前时间  YYMMDDhhmmss
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==5
      * 0:rrechargeMoney 充值金额M；
      * 1:rbuyNum        购电次数
      * 2:rmac1          MAC
      * 3:ruserNum       客户编号
      * 4:rmac2          MAC
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterRecharge1( String meterNo, String random, String athorityData1, String athorityData2, String rechargeData, String curTime);

     /**
      * 电能表开户充值（09、13）
      *
      * @param meterNo       表号  高位在前（非颠倒），高2字节补0x00
      * @param random        随机数  身份认证产生的随机数
      * @param athorityData1 权限数据1
      * @param athorityData2 权限数据2
      * @param taskData      开户数据 数据标识（4字节）+购电金额（4字节）+购电次数（4字节）+MAC1（4字节）+客户编号（6字节）+MAC2（4字节）
      * @param curTime       掌机当前时间  YYMMDDhhmmss
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:rechargeData  安全单元返回数据
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterRecharge( String meterNo, String random, String athorityData1, String athorityData2, String taskData, String curTime);

     /**
      * 与外设进行秘钥协商，获取M1和Mac1
      *
      * @param kid      秘钥kid。
      * @param wesamNum wesam芯片序列号
      * @param hhjsq    外设返回的会话计数器
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:M1       安全单元返回的密文1
      * 1:Mac1     安全单元返回的Mac1
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult wsSecretXieShang( String kid, String wesamNum, String hhjsq);

     /**
      * 与外设进行秘钥协商确认
      *
      * @param kid      秘钥kid。
      * @param wesamNum wesam芯片序列号
      * @param M2       外设返回的密文2
      * @param Mac2     外设返回的Mac2
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==0
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult wsSecretXieShangConfirm( String kid, String wesamNum, String M2, String Mac2);

     /**
      * 与外设秘钥协商后进行加密数据
      *
      * @param wsType     读取外设信息时返回的类型
      * @param data      要加密的数据
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:encryptDataLength 返回的加密后数据的长度  密文+mac的长度
      * 1:encryptData       返回的加密后的数据  密文+mac的数据
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult wsEncryptData( String wsType, String data);

     /**
      * 与外设秘钥协商后进行解密数据
      *
      * @param esamType esam类型 01，C-ESAM；02Y-ESAM；
      * @param data     转发数据内容 转发数据长度+转发数据内容
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==2
      * 0:dataLength 返回的解密后数据的长度
      * 0:data       返回的解密后的数据     明文
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult wsDecryptData( String wsType, String encryptData);

     /**
      * 698电能表会话协商验证
      *
      * @param secretData  密钥包
      * @param meterNo     若为公钥：使用ESAM序列号   若为私钥：用表号高位在前（非颠倒），高2字节补0x00；
      * @param secretSign  密钥标识
      * @param sessionData 会话数据
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==0
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterSessionTalk698Check( String secretData, String meterNo, String secretSign, String sessionData);

     /**
      * 698电能表安全数据生成
      *
      * @param taskData    主站任务数据   1字节安全模式字+任务参数类型+2字节应用层数据长度+应用层数据+4字节保护码（根据应用层数据长度可得知整个任务数据长度）
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:rtnData       转发返回数据内容
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterSafeData698(String taskData);

     /**
      * 698电能表安全传输解密
      * @param secretData      电表返回的密文链路数据
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:rtnData       应用层数据明文
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterSafeTransJieMi698(String secretData);

     /**
      * 698电能表抄读数据验证
      *
      * @param disFactor 分散因子
      * @param data      应用层数据明文
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==1
      * 0:rtnData   返回的应用层数据明文
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterDataCheck698( String disFactor, String data);

     /**
      * 698电能表抄读ESAM参数验证
      *
      * @param meterNo 若为公钥：使用ESAM序列号   若为私钥：用表号高位在前（非颠倒），高2字节补0x00；
      * @param oad     OAD
      * @param data    应用层数据
      * @return ReturnResult  :int code  0 成功  其他失败
      * :List<String> datas（code==0）:   size==0
      * :List<String> datas(code==其他): size==0
      */
     ReturnResult meterEsamParamCheck698( String meterNo, String oad, String data);









 /**
     * 电子封印读认证生成token1
     *
     * @param kid   秘钥kid。
     * @param uid   分散因子
     * @param radom 随机数
     * @param token 返回的token1
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealReadGetTokenOne(String kid, String uid, String radom);


    /**
     * 电子封印读认证验证token2
     *
     * @param kid   秘钥kid。
     * @param uid   分散因子
     * @param token 电子封印返回的token2
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealReadCheckTokenTwo(String kid, String uid,String token);


    /**
     * 加密数据地址（读）
     *
     * @param kid  秘钥kid。
     * @param uid  分散因子
     * @param data 待加密数据的地址
     * @param m1   返回的数据，密文
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealReadgetMi(String kid, String uid, String data);


    /**
     * 解密读回数据
     *
     * @param kid  秘钥kid。
     * @param uid  分散因子
     * @param data 回读的密文数据
     * @param ming 返回的数据，明文
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealReadgetMing(String kid, String uid, String data);


    /**
     * 电子封印写认证生成token1
     *
     * @param uid   分散因子
     * @param radom 随机数
     * @param date  时间
     * @param auth  操作权限
     * @param token 返回的token1
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealWriteGetTokenOne(String uid, String radom, String date, String auth);


    /**
     * 电子封印写认证验证token2
     *
     * @param uid   分散因子
     * @param token 电子封印返回的token2
     * @param date  时间
     * @param auth  操作权限
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealWriteCheckTokenTwo(String uid, String token, String date, String auth);


    /**
     * 加密数据地址（写）
     *
     * @param uid  分散因子
     * @param data 数据地址
     * @param date 时间
     * @param auth 操作权限
     * @param m1   返回的数据，密文
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealWritegetM1(String uid, String data, String date, String auth);


    /**
     * 加密写数据
     *
     * @param uid  分散因子
     * @param data 数据地址
     * @param date 时间
     * @param auth 操作权限
     * @param m2   返回的数据，密文
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealWritegetM2(String uid, String data, String date, String auth);


    /**
     * 解密执行结果
     *
     * @param uid  分散因子
     * @param mi 状态字密文
     * @param date 时间
     * @param auth 操作权限
     * @param ming   返回的数据，状态字明文
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealWritegetMing(String uid, String mi, String date,String auth);


    /**
     * 加密密钥更新数据
     *
     * @param uid  分散因子
     * @param data 数据
     * @param date 时间
     * @param auth 操作权限
     * @param mi   返回的数据，密文
     * @return 0：成功；其他-错误码
     */
    ReturnResult sealUpdategetMi(String uid, String data, String date, String auth);

  /**
       * 获取电表控制命令密文
       *
       * @param taskSign      任务标识
       * @param random2       远程认证时电表返回的随机数2
       * @param esamNo        远程认证时电表返回的ESAM编号
       * @param meterNo       电表表号
       * @param taskData      任务数据
       * @param protectCode   任务数据保护码
       * @param controlCmd    控制数据
       * @param timeLimit     任务有效期
       * @return ReturnResult  :int code  0 成功  其他失败
       *                       :List<String> datas（code==0）:
       *                                              0：enControlData 控制命令密文
       *                       :List<String> datas(code==其他): size==0
       */
       ReturnResult getRemoteControlData(String taskSign, String random2, String esamNo, String meterNo,
                                           String taskData, String protectCode, String controlCmd, String timeLimit);






































































































}
